#ifndef __LINUX_GDT_H__
#define __LINUX_GDT_H__
#include "linux/types.h"
#pragma pack(2)
typedef struct _gdtr32_data_t {
    short limit;
    int base;
} gdtr32_data_t;
#pragma pack()

typedef struct _gdt_item_t 
{
    unsigned short limit_low; // 段界限   15～0
    unsigned int base_low:24; // 段基址   23～0
    unsigned char type:4; // 段类型
    unsigned char segment: 1; // 1 表示代码或数据段， 0 表示系统段
    unsigned char privilege:2; // 特权级别 0～3
    unsigned char present:1; // 存在位， 1 表示存在， 0 表示已经交换到磁盘
    unsigned char limit_high:4; // 段界限 19～16
    unsigned char available:1; // 供系统程序或扩展使用， 一般为 0
    unsigned char long_mode:1; // 64 位代码标记， 1 表示 64 位代码， 0 表示 16 位或 32 位代码
    unsigned char big:1; // 默认操作数大小， 1 表示 32 位， 0 表示 16 位
    unsigned char granularity:1; // 粒度， 1 表示 4K 粒度， 0 表示字节粒度
    unsigned char base_high:8; // 段基址 31～24
} __attribute__((packed)) gdt_item_t;

void install_x64_descriptor();
#endif